/*
编写一个函数，给定的带有头结点的单向链表 head，给定某结点的数据域值 m，将该结点移到链首。

结构的定义：

typedef struct node
{
int num;
struct node *next;
} SNODE;

函数的原型：SNODE *movenode(SNODE *head, int m);

其中：参数 head 是单向链表的头指针；参数 m 是某结点的num成员的值。

例如输入结点数 n=7，则将结点数值域值 m=5 的结点移动到链首。函数运行前后链表的情况如下图所示。
*/

/*
测试样例1:
输入：
7 5↵
输出：
5,1,2,3,4,6,7,↵

测试样例2:
输入：
1 1↵
输出：
1,↵

测试样例3:
输入：
3 3↵
输出：
3,1,2,↵

测试样例4:
输入：
10 0↵
输出：
1,2,3,4,5,6,7,8,9,10,↵

测试样例5:
输入：
10 20↵
输出：
1,2,3,4,5,6,7,8,9,10,↵

测试样例6:
输入：
8 7↵
输出：
7,1,2,3,4,5,6,8,↵

测试样例7:
输入：
8 2↵
输出：
2,1,3,4,5,6,7,8,↵

*/
#include <stdio.h>  
#include <stdlib.h>  

typedef struct sdata  
{  int num;  
	struct sdata *next;  
} SNODE;  

void movenode( SNODE *, int );  

void setlink( SNODE * head, int n )  
{     
	SNODE *p;  
	
	while ( n > 0 )  
		{   p = ( SNODE * ) malloc( sizeof( SNODE ) );  
			p->num = n;  
			p->next = head->next;  
			head->next = p;  
			n --;  
		}  
}  

void outlink( SNODE * head )  
{  
	while( head->next != NULL )  
		{  
			head = head->next;  
			printf( "%d,", head->num );  
		}  
	return;  
}  

int main( )  
{   int n, m;  
	SNODE * head = NULL;  
	
	scanf("%d%d", &n, &m );  
	head = ( SNODE * ) malloc( sizeof( SNODE ) );  
	head->num = -1;  
	head->next = NULL;  
	setlink( head, n );  
	
	movenode( head, m );   /* This is waiting for you. */  
	
	outlink( head );  
	printf("\n");  
	return 0;  
}  